package dao;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

import dao.MoodleDAO;

import moodle.dados.Aluno;
import moodle.dados.Curso;
import moodle.dados.atividades.Chat;
import moodle.dados.atividades.DataBase;
import moodle.dados.atividades.Escolha;
import moodle.dados.atividades.FerramentaExterna;
import moodle.dados.atividades.Forum;
import moodle.dados.atividades.Glossario;
import moodle.dados.atividades.LaboratorioDeAvaliacao;
import moodle.dados.atividades.Licao;
import moodle.dados.atividades.PesquisaAvaliacao;
import moodle.dados.atividades.Questionario;
import moodle.dados.atividades.Scorm;
import moodle.dados.atividades.Tarefas;
import moodle.dados.atividades.Wiki;


public class GerenciaCurso {

	private List<Curso> cursos;
	
	public GerenciaCurso() {
		cursos = new ArrayList<Curso>();
	}
	
	public List<Curso> getCursos(){
		return cursos;
	}
	
	public void addCursos(){
		MoodleDAO<Curso> cursoDAO = new MoodleDAO<Curso>();
		cursos = cursoDAO.find("SELECT c FROM Curso c");
	}

	public static void addAlunosCurso(Curso curso){

		
		Query query = MoodleDAO.findNativeQueryParameterized("SELECT id FROM mdl_context WHERE contextlevel=50 and instanceid = ?1");
		query.setParameter(1, curso.getId());
		
		Query query2 = MoodleDAO.findNativeQueryParameterized("SELECT userid FROM mdl_role_assignments WHERE roleid=5 and contextid = ?1");
		query2.setParameter(1, query.getSingleResult());
		
		List<BigInteger> usersIds = query2.getResultList();
		
		Iterator<BigInteger> iterator = usersIds.iterator();
		
		int idUser;
		
		MoodleDAO<Aluno> alunoDAO = new MoodleDAO<Aluno>();
		
		while(iterator.hasNext()){
			idUser = iterator.next().intValue();
			Aluno aluno = alunoDAO.find(Aluno.class, idUser);
			curso.addAluno(aluno);
		}
		
	}
	
public static void addAtividadePesquisaAvaliacao(Curso curso){
		
		Query query = MoodleDAO.createNamedQuery("PesquisaAvaliacao.findByCourse");
		query.setParameter(1, curso.getId());
		
		List<PesquisaAvaliacao> pesquisas = query.getResultList();
		curso.addAtividadeParticipacao(pesquisas);
		
		List<Aluno> alunosCurso = curso.getAlunos();
		
		Query queryAluno = MoodleDAO.findNativeQueryParameterized("SELECT id FROM mdl_survey_answers WHERE survey = ?1 and userid = ?2 LIMIT 1");
		
		if(!pesquisas.isEmpty()){
			
			for(PesquisaAvaliacao pa : pesquisas){
				
				queryAluno.setParameter(1, pa.getId());
				
				for(Aluno a : alunosCurso){
					
					queryAluno.setParameter(2, a.getId());
					if(!queryAluno.getResultList().isEmpty()){
						pa.addAlunosParticipantes(a);
					
					}
				}
			}
				
		}
			
	}
	
	public static void addAtividadeBancoDeDados(Curso curso){
		Query query = MoodleDAO.createNamedQuery("DataBase.findByCourse");
		query.setParameter(1, curso.getId());
		List<DataBase> dataBases = query.getResultList();
		curso.addAtividadeParticipacao(dataBases);
		Query queryAluno = MoodleDAO.findNativeQueryParameterized("SELECT userid FROM mdl_data_records WHERE id =?1");
		MoodleDAO<Aluno> alunos = new MoodleDAO<Aluno>();
		for(DataBase db : dataBases){
			queryAluno.setParameter(1, db.getId());
			Aluno a = alunos.find(Aluno.class, queryAluno.getFirstResult());
			db.addAlunosParticipantes(a);
		}
	}
	
	public static void addArividadeEscolha(Curso curso){
		Query query = MoodleDAO.createNamedQuery("Escolha.findByCourse");
		query.setParameter(1, curso.getId());
		List<Escolha> escolhas = query.getResultList();
		curso.addAtividadeParticipacao(escolhas);
		Query queryAluno = MoodleDAO.findNativeQueryParameterized("SELECT userid FROM mdl_choice_answers WHERE choiceid = ?1");
		MoodleDAO<Aluno> alunos = new MoodleDAO<Aluno>();
			for(Escolha escolhaCorrente : escolhas){
				queryAluno.setParameter(1, escolhaCorrente.getId());
				Aluno a = alunos.find(Aluno.class, queryAluno.getFirstResult());
				escolhaCorrente.addAlunosParticipantes(a);
			}
	}
	
	public static void addAtividadeChat(Curso curso){
		Query query = MoodleDAO.createNamedQuery("Chat.findByCourse");
		query.setParameter(1, curso.getId());
		List<Chat> chats = query.getResultList();
		curso.addAtividadeParticipacao(chats);
		Query queryAluno = MoodleDAO.findNativeQueryParameterized("SELECT userid FROM mdl_chat_messages WHERE id = ?1");
		MoodleDAO<Aluno> alunos = new MoodleDAO<Aluno>();
			for(Chat chatCorrent : chats){
				queryAluno.setParameter(1, chatCorrent.getId());
				Aluno a = alunos.find(Aluno.class, queryAluno.getFirstResult());
				chatCorrent.addAlunosParticipantes(a);
			}
	}
	
	public static void addAtividadeForum(Curso curso){
		Query query = MoodleDAO.createNamedQuery("Forum.findByCourse");
		query.setParameter(1, curso.getId());
		List<Forum> foruns = query.getResultList();
		curso.addAtividadeParticipacao(foruns);
		Query queryAluno = MoodleDAO.findNativeQueryParameterized("SELECT userid FROM mdl_forum_posts WHERE discussion =?1");
		MoodleDAO<Aluno> alunos = new MoodleDAO<Aluno>();
		for(Forum f : foruns){
			queryAluno.setParameter(1, f.getId());
			Aluno a = alunos.find(Aluno.class, queryAluno.getFirstResult());
			f.addAlunosParticipantes(a);
		}	
	}
	
	
	
	public static void addAtividadeScorm(Curso curso){
		
		Query query = MoodleDAO.createNamedQuery("Scorm.findByCourse");
		query.setParameter(1, curso.getId());
		
		List<Scorm> scorms = query.getResultList();
		curso.addAtividadeParticipacao(scorms);
		
		/* Falta definir os alunos! */
	
	}
	
	public static void addAtividadeWiki(Curso curso){
			
		Query query = MoodleDAO.createNamedQuery("Wiki.findByCourse");
		query.setParameter(1, curso.getId());
		
		List<Wiki> wikis = query.getResultList();
		curso.addAtividadeParticipacao(wikis);
		
		/* Falta definir os alunos! */
	
		
	}
	
	public static void addAtividadeQuestionario(Curso curso){
	
		Query query = MoodleDAO.createNamedQuery("Questionario.findByCourse");
		query.setParameter(1, curso.getId());
		
		List<Questionario> questionarios = query.getResultList();
		curso.addAtividadeParticipacao(questionarios);
		
		/* Falta definir os alunos! */
		
	}
	
	public static void addAtividadeTarefas(Curso curso) {
		
		Query query = MoodleDAO.findNativeQueryParameterized("SELECT id FROM mdl_grade_items WHERE courseid = ?1 AND itemmodule = 'assignment'");
		query.setParameter(1, curso.getId());
		
		List<BigInteger> usersIds = query.getResultList();
		Iterator<BigInteger> iterator = usersIds.iterator();
		
		long id;
		
		MoodleDAO<Tarefas> atividadeDAO = new MoodleDAO<Tarefas>();
		
		while(iterator.hasNext()){
			id = iterator.next().intValue();
			Tarefas atividade = atividadeDAO.find(Tarefas.class, id);
			curso.addAtividadeNota(atividade);
			//Adiciona notas
			query = MoodleDAO.findNativeQueryParameterized("SELECT id FROM mdl_grade_grades WHERE itemid = ?1");
			query.setParameter(1, atividade.getId());
			
			List<BigInteger> itemsIds = query.getResultList();
			Iterator<BigInteger> iterator2 = itemsIds.iterator();
			while(iterator2.hasNext()){
				int idNota = iterator2.next().intValue();
				BigInteger idAluno = MoodleDAO.findNativeQuery("SELECT userid FROM mdl_grade_grades WHERE id = " + idNota);
				BigDecimal nota = MoodleDAO.findNativeQuery("SELECT rawgrade FROM mdl_grade_grades WHERE id = " + idNota);
				atividade.addNota(idAluno.intValue(), nota.intValue());
			}
		}
	}
	
	public static void addAtividadeFerramentaExterna(Curso curso) {
		
	Query query = MoodleDAO.findNativeQueryParameterized("SELECT id FROM mdl_lti WHERE course = ?1");
		query.setParameter(1, curso.getId());
		List<BigInteger> usersIds = query.getResultList();
		Iterator<BigInteger> iterator = usersIds.iterator();
		long id;
		MoodleDAO<FerramentaExterna> atividadeDAO = new MoodleDAO<FerramentaExterna>();
		
		while(iterator.hasNext()){
			id = iterator.next().intValue();
			FerramentaExterna atividade = atividadeDAO.find(FerramentaExterna.class, id);
			curso.addAtividadeParticipacao(atividade);
		}	
	}
	
	public static void addAtividadeGlossario(Curso curso) {
		Query query = MoodleDAO.createNamedQuery("Glossario.findByCourse");
		query.setParameter(1, curso.getId());
		List<Glossario> glossary = query.getResultList();
		curso.addAtividadeParticipacao(glossary);
		Query queryAluno = MoodleDAO.findNativeQueryParameterized("SELECT userid FROM mdl_glossary_entries WHERE id = ?1");
		MoodleDAO<Aluno> alunos = new MoodleDAO<Aluno>();
			for(Glossario glossaryCorrent : glossary){
				queryAluno.setParameter(1, glossaryCorrent.getId());
				Aluno a = alunos.find(Aluno.class, queryAluno.getFirstResult());
				glossaryCorrent.addAlunosParticipantes(a);
			}
	}
	
	public static void addAtividadeLicao(Curso curso) {
			
		Query query = MoodleDAO.findNativeQueryParameterized("SELECT id FROM mdl_lesson WHERE course = ?1");
		query.setParameter(1, curso.getId());
		List<BigInteger> usersIds = query.getResultList();
		Iterator<BigInteger> iterator = usersIds.iterator();
		long id;
		MoodleDAO<Licao> atividadeDAO = new MoodleDAO<Licao>();
			
		while(iterator.hasNext()){
			id = iterator.next().intValue();
			Licao atividade = atividadeDAO.find(Licao.class, id);
			curso.addAtividadeNota(atividade);
			//adiciona as notas
			query = MoodleDAO.findNativeQueryParameterized("SELECT id FROM mdl_lesson_grades WHERE lessonid = ?1");
			query.setParameter(1, atividade.getId());
			
			List<BigInteger> itemsIds = query.getResultList();
			Iterator<BigInteger> iterator2 = itemsIds.iterator();
			while(iterator2.hasNext()){
				int idNota = iterator2.next().intValue();
				BigInteger idAluno = MoodleDAO.findNativeQuery("SELECT userid FROM mdl_lesson_grades WHERE id = " + idNota);
				Double nota = MoodleDAO.findNativeQuery("SELECT grade FROM mdl_lesson_grades WHERE id = " + idNota);
				atividade.addNota(idAluno.intValue(), nota.intValue());
			}
		}
	}
	
	public static void addAtividadeLaboratorioDeAvaliacao(Curso curso) {
		
		Query query = MoodleDAO.findNativeQueryParameterized("SELECT id FROM mdl_workshop WHERE course = ?1");
		query.setParameter(1, curso.getId());
		List<BigInteger> usersIds = query.getResultList();
		Iterator<BigInteger> iterator = usersIds.iterator();
		long id;
		MoodleDAO<LaboratorioDeAvaliacao> atividadeDAO = new MoodleDAO<LaboratorioDeAvaliacao>();
			
		while(iterator.hasNext()){
			id = iterator.next().intValue();
			LaboratorioDeAvaliacao atividade = atividadeDAO.find(LaboratorioDeAvaliacao.class, id);
			curso.addAtividadeNota(atividade);
			//adiciona notas
			query = MoodleDAO.findNativeQueryParameterized("SELECT id FROM mdl_workshop_submissions WHERE workshopid = ?1");
			query.setParameter(1, atividade.getId());
			
			List<BigInteger> itemsIds = query.getResultList();
			Iterator<BigInteger> iterator2 = itemsIds.iterator();
			while(iterator2.hasNext()){
				int idNota = iterator2.next().intValue();
				BigInteger idAluno = MoodleDAO.findNativeQuery("SELECT authorid FROM mdl_workshop_submissions WHERE id = " + idNota);
				BigDecimal nota = MoodleDAO.findNativeQuery("SELECT grade FROM mdl_workshop_submissions WHERE id = " + idNota);
				atividade.addNota(idAluno.intValue(), nota.intValue());
			}
		}
	}
}